This is an example of Simulated Annealing for finding global minima of a function value.
Problem Description
Find the value of \(x_1\) and \(x_2\) to make the following function return closest number to zero where \(-1 \leq x_1, x_2 \leq 1\).
\[
f(x_1, x_2) = 0.2 \times {x_1}^2 + {x_2}^2 - 0.1 \times \cos(6 \times 3.1415 \times x_1) - 0.1 \times \cos(6 \times 3.1415 \times x_2)
\]
Implementation
First, we need several library before implements the SA (simulated annealing) algorithm.
library(pracma)
library(plotly)
Then, we define the function in R. Also, we will choose a random starting point and creating a Mesh Grid for visualization.
f <- (function(x1, x2)
0.2 * (x1 * x1) + (x2 * x2) - 0.1 * cos(6 * 3.1415 * x1) - 0.1 * cos(6 * 3.1415 * x2)
)
x_start <- c(0.7, -0.2)
mesh_grid <- meshgrid(seq(-1.0, 1.0, by = 0.01), seq(-1.0, 1.0, by = 0.01))
mesh_x1 <- mesh_grid$X
mesh_x2 <- mesh_grid$Y
f_mesh <- mesh_grid
for (i in range(length(mesh_x1[[1]])))
for (j in range(length(mesh_x2[[2]])))
f_mesh[[i]][[j]] <- f(mesh_x1[[i]][[j]], mesh_x2[[i]][[j]])
plot_ly(z = f_mesh$Y * f_mesh$X, type = "contour", contours = list(coloring = "heatmap", showlabels = TRUE))
LS0tCnRpdGxlOiAiR2xvYmFsIE1pbmltYSBQcm9ibGVtIgphdXRob3I6ICJXaXNudSBBZGkgTnVyY2FoeW8iCmRhdGU6ICJTZXB0ZW1iZXIgMTd0aCwgMjAxOCIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKVGhpcyBpcyBhbiBleGFtcGxlIG9mIFNpbXVsYXRlZCBBbm5lYWxpbmcgZm9yIGZpbmRpbmcgZ2xvYmFsIG1pbmltYSBvZiBhIGZ1bmN0aW9uIHZhbHVlLgoKIyMgUHJvYmxlbSBEZXNjcmlwdGlvbgoKRmluZCB0aGUgdmFsdWUgb2YgJHhfMSQgYW5kICR4XzIkIHRvIG1ha2UgdGhlIGZvbGxvd2luZyBmdW5jdGlvbiByZXR1cm4gY2xvc2VzdCBudW1iZXIgdG8gKip6ZXJvKioKd2hlcmUgJC0xIFxsZXEgeF8xLCB4XzIgXGxlcSAxJC4KCiQkCmYoeF8xLCB4XzIpID0gMC4yIFx0aW1lcyB7eF8xfV4yICsge3hfMn1eMiAtIDAuMSBcdGltZXMgXGNvcyg2IFx0aW1lcyAzLjE0MTUgXHRpbWVzIHhfMSkgLSAwLjEgXHRpbWVzIFxjb3MoNiBcdGltZXMgMy4xNDE1IFx0aW1lcyB4XzIpCiQkCgojIyBJbXBsZW1lbnRhdGlvbgoKRmlyc3QsIHdlIG5lZWQgc2V2ZXJhbCBsaWJyYXJ5IGJlZm9yZSBpbXBsZW1lbnRzIHRoZSBTQSAoc2ltdWxhdGVkIGFubmVhbGluZykgYWxnb3JpdGhtLgoKYGBge3IgbWVzc2FnZT1GQUxTRX0KbGlicmFyeShwcmFjbWEpCmxpYnJhcnkocGxvdGx5KQpgYGAKClRoZW4sIHdlIGRlZmluZSB0aGUgZnVuY3Rpb24gaW4gUi4gQWxzbywgd2Ugd2lsbCBjaG9vc2UgYSByYW5kb20gc3RhcnRpbmcgcG9pbnQgYW5kIGNyZWF0aW5nIGEgTWVzaCBHcmlkIGZvciB2aXN1YWxpemF0aW9uLgoKYGBge3J9CmYgPC0gKGZ1bmN0aW9uKHgxLCB4MikKICAwLjIgKiAoeDEgKiB4MSkgKyAoeDIgKiB4MikgLSAwLjEgKiBjb3MoNiAqIDMuMTQxNSAqIHgxKSAtIDAuMSAqIGNvcyg2ICogMy4xNDE1ICogeDIpCikKCnhfc3RhcnQgPC0gYygwLjcsIC0wLjIpCgptZXNoX2dyaWQgPC0gbWVzaGdyaWQoc2VxKC0xLjAsIDEuMCwgYnkgPSAwLjAxKSwgc2VxKC0xLjAsIDEuMCwgYnkgPSAwLjAxKSkKbWVzaF94MSA8LSBtZXNoX2dyaWQkWAptZXNoX3gyIDwtIG1lc2hfZ3JpZCRZCmZfbWVzaCA8LSBtZXNoX2dyaWQKCmZvciAoaSBpbiByYW5nZShsZW5ndGgobWVzaF94MVtbMV1dKSkpCiAgZm9yIChqIGluIHJhbmdlKGxlbmd0aChtZXNoX3gyW1syXV0pKSkKICAgIGZfbWVzaFtbaV1dW1tqXV0gPC0gZihtZXNoX3gxW1tpXV1bW2pdXSwgbWVzaF94MltbaV1dW1tqXV0pCgpwbG90X2x5KHogPSBmX21lc2gkWSAqIGZfbWVzaCRYLCB0eXBlID0gImNvbnRvdXIiLCBjb250b3VycyA9IGxpc3QoY29sb3JpbmcgPSAiaGVhdG1hcCIsIHNob3dsYWJlbHMgPSBUUlVFKSkKYGBgCgo=